<?php
/*
    本程序可以将ASS解析XML，在制作本程序时，严格按照ASS文档顺序来制作，没有冗余，一旦出错就会导致程序终止，修改本程序请按照ASS文档格式进行。

    由于PHP暂时无法识别unicode，本程序和ASS文档都必须以UTF-8来保存，否则即使格式正确也会解析错误。
	
	请注意，SSA和ASS文档格式有差异，除了文件后缀名外，查看[script info]也可以区别：
	ScriptType: v4.00+ ————> ASS;
	ScriptType: v4.00  ————> SSA;
	本程序无法解析SSA格式，如果要使用SSA文档，需要借助第三方软件转换为ASS后才能使用，比如：SubResync，另外SSA的部分效果和ASS有所不同。
	                                 
本程序已知的问题：
1、程序会忽略script info里被注释掉的部分，就是以 ； 开头的部分，如果想把这部分包括进去，在生成script info数组的程序里可以改
2、events里除了dialogue，现在已知的还有Comment，可能还有其他的fotmat，但是现在不知道comment是做什么用的，在尝试去除comment时程序会出错，所以暂时把comment当作dialogue写入XML

                                      Noah～～
									  文档最后修改日期：
									  2011-04-14
*/




//$subtitle_file_name="ab.ass";
$subtitle_file_name=$_POST["sub_file_name"];//文件编码应为UTF-8
if(!file_exists($subtitle_file_name))
{echo subtitle_not_exist();}
else
{echo make_xml($subtitle_file_name);}


function make_error_xml()//当解析出错时，比如ASS文档格式不正确，文件不是以UTF8格式保存等等
{
	$not=new DOMDocument("1.0","utf-8");
header("Content-Type: text/xml");
    $not->appendChild($not->createElement("subtitle_error","无法解析字幕"));
	return $not->saveXML();
}

function subtitle_not_exist()
{
	$sub_xml=new DOMDocument("1.0","utf-8");
header("Content-Type: text/xml");
    $sub_xml->appendChild($sub_xml->createElement("subtitle_error","找不到字幕"));
	return $sub_xml->saveXML();
}

//explode(separator,string,limit)
function make_xml($file_name)//生成字幕XML
{
$file_pointer=file($file_name);
$head_string_of_scriptinfo="[Script Info]";//
$head_string_of_v4styles="[V4+ Styles]";
$head_string_of_events="[Events]";

$script_info_name=array();
//$v4_styles_name=array();
//$events_name=array();

$script_info_value=array();
//$v4_styles_value=array();
//$events_value=array();

$v4_styles=array();

$events=array();

$remove=array("\r\n","\n","\r");
$file_pointer=str_replace($remove,"",$file_pointer);//去掉文本换行符，替换一些转义字符
$file_pointer=str_replace("<","&it;",$file_pointer);
$file_pointer=str_replace(">","&gt;",$file_pointer);
$file_pointer=str_replace("&","&amp;",$file_pointer);
$file_pointer=str_replace("\'","&apos;",$file_pointer);
$file_pointer=str_replace("\"","&quot;",$file_pointer);

for($b=0;$b<count($file_pointer);$b++)//得到各数组的起始结束位置
{
	if($file_pointer[$b]==$head_string_of_scriptinfo||substr($file_pointer[$b],3,strlen($head_string_of_scriptinfo))==$head_string_of_scriptinfo)//每行前3个字符不知道是什么，导致一直无法检查到正确的名称
	{$head_string_of_scriptinfo_line=$b;}
	if($file_pointer[$b]==$head_string_of_v4styles)
	{$head_string_of_v4styles_line=$b;}
	if($file_pointer[$b]==$head_string_of_events)
	{$head_string_of_events_line=$b;}
}

$script_array_length=0;
for($v=$head_string_of_scriptinfo_line+1;$v<$head_string_of_v4styles_line-1;$v++)//生成script info数组
{
	if(substr($file_pointer[$v],0,1)!=";"&&$file_pointer[$v]!="")
	{
	$tmp1=explode(":",$file_pointer[$v],2);
	$script_info_name[$script_array_length]=$tmp1[0];
	$script_info_value[$script_array_length]=$tmp1[1];
	$script_array_length++;
	}
}

$v4_style_array_length=0;
for($v=$head_string_of_v4styles_line+1;$v<$head_string_of_events_line-1;$v++)//生成v4 styles数组
{
	if(substr($file_pointer[$v],0,1)!=";"&&$file_pointer[$v]!="")
	//&&substr($file_pointer[$v],0,5)=="Style")
	{
	$tmp2_1=explode(":",$file_pointer[$v],2);
	$tmp2=explode(",",$tmp2_1[1],23);//这是v4 styles里的23种属性
	for($q=0;$q<count($tmp2);$q++)

	{$v4_styles[$v4_style_array_length][$q]=$tmp2[$q];}
	$v4_style_array_length++;
	}
}

$events_array_length=0;
for($v=$head_string_of_events_line+1;$v<count($file_pointer);$v++)//生成events数组
{
	if(substr($file_pointer[$v],0,1)!=";"
	&&$file_pointer[$v]!="")
	//&&substr($file_pointer[$v],0,8)=="Dialogue")//准备给comment属性用
	{
	$tmp3_1=explode(":",$file_pointer[$v],2);
	$tmp3=explode(",",$tmp3_1[1],10);//分为10个部分分别对events里的format
	for($q=0;$q<count($tmp3);$q++)
	{$events[$events_array_length][$q]=$tmp3[$q];}
	$events_array_length++;
	}
	
}


//test($v4_styles);
//test($events,$events_value);
//echo count($script_info_name);
//echo $events[0][0];
//echo count($events);
function test($array)
{
for($s=0;$s<count($array);$s++)
{
	for($p=0;$p<count($array[$s]);$p++)
	{echo $array[$s][$p]."|";}
	echo "<br>";
}
}



$xml=new DOMDocument("1.0","utf-8");
header("Content-Type: text/xml");

$root=$xml->createElement("subtitle");
$xml->appendChild($root);

//script info
$script=$xml->createElement("script_info");
$root->appendChild($script);
for($w=0;$w<count($script_info_name);$w++)//将script info数组写入XML文档
{
	$script_element=$xml->createElement(preg_replace("/\s/","_",$script_info_name[$w]),$script_info_value[$w]);//需要替换掉空格
	//$script_element=$xml->createElement("s","f");
	$script->appendChild($script_element);
	
	//echo preg_replace("/\s/","_",$script_info_name[$w]."|");
}

//v4_styles
$v4=$xml->createElement("v4_styles");//将v4 styles数组写入XML文档
$root->appendChild($v4);
for($w=0;$w<count($v4_styles)-1;$w++)
{
$styles=$xml->createElement("style");
$v4->appendChild($styles);
  for($x=0;$x<count($v4_styles[$w]);$x++)
  {
  $v4_element=$xml->createElement(preg_replace("/\s/","",$v4_styles[0][$x]),preg_replace("/\s/","",$v4_styles[$w+1][$x]));
$styles->appendChild($v4_element);
  }
   
}

//events
$event=$xml->createElement("events");//将events数组写入XML文档
$root->appendChild($event);
for($w=0;$w<count($events)-1;$w++)
{
$event_1=$xml->createElement("dialogue");//dialogue是events数组的一部分
$event->appendChild($event_1);

  for($x=0;$x<count($events[$w]);$x++)
  {
 // $event_element=$xml->createElement(preg_replace("/\s/","",$events[0][$x]),$events[$w+1][$x]);
  $event_element=$xml->createElement(preg_replace("/\s/","",$events[0][$x]),$events[$w+1][$x]);
  $event_1->appendChild($event_element);
  }
  
}

return $xml->saveXML();
}


/*
for($w=0;$w<count($events);$w++)
{
  for($x=0;$x<count($events[$w]);$x++)
  {
 // $v4_element=$xml->createElement(preg_replace("/\s/","_",$v4_styles[0][$x]),$v4_styles[$w][$x]);
 echo $events[0][$x]."|".$events[$w+1][$x]."<br>";

  }
}
*/

//以下函数废弃，其效果已在CSS3中实现
function css_color_change($color_string)//将ASS颜色转换为HTML颜色
{
	/*
	
	&H                0 0      0 0    0 0     0 0
	16进制颜色   字体透明度alpha   蓝色    绿色    红色
	
	透明度可能在字幕深度开发时会用到，记得在下面补上alpha值后才在javascript里解析
	
	*/
	return $new_color_string="#".
	substr(preg_replace("/\s/","",$color_string),12,2).
	substr(preg_replace("/\s/","",$color_string),10,2).
	substr(preg_replace("/\s/","",$color_string),8,2);
}
?>